{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f2b7c9d0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 词汇表： ['Xiaoxue', 'is', 'Niuzong', 'Student', 'Teacher', 'Boss', 'Mazong', 'Xiaobing', 'Kage']\n",
      " 词汇到索引的字典： {'Xiaoxue': 0, 'is': 1, 'Niuzong': 2, 'Student': 3, 'Teacher': 4, 'Boss': 5, 'Mazong': 6, 'Xiaobing': 7, 'Kage': 8}\n",
      " 索引到词汇的字典： {0: 'Xiaoxue', 1: 'is', 2: 'Niuzong', 3: 'Student', 4: 'Teacher', 5: 'Boss', 6: 'Mazong', 7: 'Xiaobing', 8: 'Kage'}\n",
      " 词汇表大小： 9\n"
     ]
    }
   ],
   "source": [
    "# 定义一个句子列表，后面会用这些句子来训练 CBOW 和 Skip-Gram 模型\n",
    "sentences = [\"Kage is Teacher\", \"Mazong is Boss\", \"Niuzong is Boss\",\n",
    "             \"Xiaobing is Student\", \"Xiaoxue is Student\",]\n",
    "# 将所有句子连接在一起，然后用空格分隔成多个单词\n",
    "words = ' '.join(sentences).split()\n",
    "# 构建词汇表，去除重复的词\n",
    "word_list = list(set(words))\n",
    "# 创建一个字典，将每个词映射到一个唯一的索引\n",
    "word_to_idx = {word: idx for idx, word in enumerate(word_list)}\n",
    "# 创建一个字典，将每个索引映射到对应的词\n",
    "idx_to_word = {idx: word for idx, word in enumerate(word_list)}\n",
    "voc_size = len(word_list) # 计算词汇表的大小\n",
    "print(\" 词汇表：\", word_list) # 输出词汇表\n",
    "print(\" 词汇到索引的字典：\", word_to_idx) # 输出词汇到索引的字典\n",
    "print(\" 索引到词汇的字典：\", idx_to_word) # 输出索引到词汇的字典\n",
    "print(\" 词汇表大小：\", voc_size) # 输出词汇表大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7255a046",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CBOW 数据样例（未编码）： [('Kage', ['is', 'Teacher']), ('is', ['Kage', 'Teacher']), ('Teacher', ['Kage', 'is'])]\n"
     ]
    }
   ],
   "source": [
    "# 生成 CBOW 训练数据\n",
    "def create_cbow_dataset(sentences, window_size=2):\n",
    "    data = []# 初始化数据\n",
    "    for sentence in sentences:\n",
    "        sentence = sentence.split()  # 将句子分割成单词列表\n",
    "        for idx, word in enumerate(sentence):  # 遍历单词及其索引\n",
    "            # 获取上下文词汇，将当前单词前后各 window_size 个单词作为周围词\n",
    "            context_words = sentence[max(idx - window_size, 0):idx] \\\n",
    "                + sentence[idx + 1:min(idx + window_size + 1, len(sentence))]\n",
    "            # 将当前单词与上下文词汇作为一组训练数据\n",
    "            data.append((word, context_words))\n",
    "    return data\n",
    "# 使用函数创建 CBOW 训练数据\n",
    "cbow_data = create_cbow_dataset(sentences)\n",
    "# 打印未编码的 CBOW 数据样例（前三个）\n",
    "print(\"CBOW 数据样例（未编码）：\", cbow_data[:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cd08ed75",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "One-Hot 编码前的单词： Teacher\n",
      "One-Hot 编码后的向量： tensor([0., 0., 0., 0., 1., 0., 0., 0., 0.])\n"
     ]
    }
   ],
   "source": [
    "# 定义 One-Hot 编码函数\n",
    "import torch # 导入 torch 库\n",
    "def one_hot_encoding(word, word_to_idx):    \n",
    "    tensor = torch.zeros(len(word_to_idx)) # 创建一个长度与词汇表相同的全 0 张量  \n",
    "    tensor[word_to_idx[word]] = 1  # 将对应词的索引设为 1\n",
    "    return tensor  # 返回生成的 One-Hot 向量\n",
    "# 展示 One-Hot 编码前后的数据\n",
    "word_example = \"Teacher\"\n",
    "print(\"One-Hot 编码前的单词：\", word_example)\n",
    "print(\"One-Hot 编码后的向量：\", one_hot_encoding(word_example, word_to_idx))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e6c40903",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CBOW 模型： CBOW(\n",
      "  (input_to_hidden): Linear(in_features=9, out_features=2, bias=False)\n",
      "  (hidden_to_output): Linear(in_features=2, out_features=9, bias=False)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "# 定义 CBOW 模型\n",
    "import torch.nn as nn # 导入 neural network\n",
    "class CBOW(nn.Module):\n",
    "    def __init__(self, voc_size, embedding_size):\n",
    "        super(CBOW, self).__init__()\n",
    "        # 从词汇表大小到嵌入大小的线性层（权重矩阵）\n",
    "        self.input_to_hidden = nn.Linear(voc_size, \n",
    "                                         embedding_size, bias=False)  \n",
    "        # 从嵌入大小到词汇表大小的线性层（权重矩阵）\n",
    "        self.hidden_to_output = nn.Linear(embedding_size, \n",
    "                                          voc_size, bias=False)  \n",
    "    def forward(self, X): # X: [num_context_words, voc_size]\n",
    "        # 生成嵌入：[num_context_words, embedding_size]\n",
    "        embeddings = self.input_to_hidden(X)  \n",
    "        # 计算隐藏层，求嵌入的均值：[embedding_size]\n",
    "        hidden_layer = torch.mean(embeddings, dim=0)  \n",
    "        # 生成输出层：[1, voc_size]\n",
    "        output_layer = self.hidden_to_output(hidden_layer.unsqueeze(0)) \n",
    "        return output_layer    \n",
    "embedding_size = 2 # 设定嵌入层的大小，这里选择 2 是为了方便展示\n",
    "cbow_model = CBOW(voc_size,embedding_size)  # 实例化 CBOW 模型\n",
    "print(\"CBOW 模型：\", cbow_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "010e5aa3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 100, Loss: 2.1371095180511475\n",
      "Epoch: 200, Loss: 2.114210780461629\n",
      "Epoch: 300, Loss: 2.0865681091944377\n",
      "Epoch: 400, Loss: 2.0524648745854694\n",
      "Epoch: 500, Loss: 2.010000443458557\n",
      "Epoch: 600, Loss: 1.9573023001352945\n",
      "Epoch: 700, Loss: 1.893039353688558\n",
      "Epoch: 800, Loss: 1.817344347635905\n",
      "Epoch: 900, Loss: 1.7329498807589212\n",
      "Epoch: 1000, Loss: 1.6456005891164145\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练 Skip-Gram 类\n",
    "learning_rate = 0.001 # 设置学习速率\n",
    "epochs = 1000 # 设置训练轮次\n",
    "criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数\n",
    "import torch.optim as optim # 导入随机梯度下降优化器\n",
    "optimizer = optim.SGD(cbow_model.parameters(), lr=learning_rate)  \n",
    "# 开始训练循环\n",
    "loss_values = []  # 用于存储每轮的平均损失值\n",
    "for epoch in range(epochs):\n",
    "    loss_sum = 0 # 初始化损失值\n",
    "    for target, context_words in cbow_data:\n",
    "        # 将上下文词转换为 One-Hot 向量并堆叠\n",
    "        X = torch.stack([one_hot_encoding(word, word_to_idx) for word in context_words]).float() \n",
    "        # 将目标词转换为索引值\n",
    "        y_true = torch.tensor([word_to_idx[target]], dtype=torch.long) \n",
    "        y_pred = cbow_model(X)  # 计算预测值\n",
    "        loss = criterion(y_pred, y_true)  # 计算损失\n",
    "        loss_sum += loss.item() # 累积损失\n",
    "        optimizer.zero_grad()  # 清空梯度\n",
    "        loss.backward()  # 反向传播\n",
    "        optimizer.step()  # 更新参数\n",
    "    if (epoch+1) % 100 == 0: # 输出每 100 轮的损失，并记录损失\n",
    "      print(f\"Epoch: {epoch+1}, Loss: {loss_sum/len(cbow_data)}\")  \n",
    "      loss_values.append(loss_sum / len(cbow_data))\n",
    "# 绘制训练损失曲线\n",
    "import matplotlib.pyplot as plt # 导入 matplotlib\n",
    "# 绘制二维词向量图\n",
    "plt.rcParams[\"font.family\"]=['SimHei'] # 用来设定字体样式\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] # 用来设定无衬线字体样式\n",
    "plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号\n",
    "plt.plot(range(1, epochs//100 + 1), loss_values) # 绘图\n",
    "plt.title(' 训练损失曲线 ') # 图题\n",
    "plt.xlabel(' 轮次 ') # X 轴 Label\n",
    "plt.ylabel(' 损失 ') # Y 轴 Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "91da6631",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Skip-Gram 词嵌入：\n",
      "Xiaoxue: [-0.5842088   0.21841691]\n",
      "is: [ 0.6250008 -0.8186659]\n",
      "Niuzong: [0.03038938 0.60383385]\n",
      "Student: [-1.2024668  0.3539113]\n",
      "Teacher: [-0.37656686  1.0371245 ]\n",
      "Boss: [-0.3826948   0.89280415]\n",
      "Mazong: [0.2657739  0.15451309]\n",
      "Xiaobing: [-0.4118811  0.6344902]\n",
      "Kage: [0.10943636 0.7646477 ]\n"
     ]
    }
   ],
   "source": [
    "# 输出 Skip-Gram 习得的词嵌入\n",
    "print(\"Skip-Gram 词嵌入：\")\n",
    "for word, idx in word_to_idx.items(): # 输出每个词的嵌入向量\n",
    " print(f\"{word}: {cbow_model.input_to_hidden.weight[:,idx].detach().numpy()}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4934c513",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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9eqVWO7g4ICkpCSVsqysLBgYGKjV77p163D8+HGcP3++1DaWlpZ48OABFAoFDA0N1R4zERERvZw0Zo2Qj48P4uLixOepqalQKBSwtrYud9szZ85g/Pjx2Lp1q0rQ6t+/v0qf8fHxcHBwYAgiIiIiABoUhDp06ACZTIYNGzYAAMLDw+Hv7w9dXV0Az3ZxKZXKYtulp6cjMDAQX331Fby9vZGdnY3s7GwAzxZcT5gwAadPn8aePXsQEhIirh8iIiIiqvE1QmXZsWMHBgwYADMzMxQUFCA2NhYtW7YEADRo0AALFy5E3759VbZZuHAhJkyYUKwvQRCgVCoxatQobNu2Dfb29hg0aBCCg4Ohp6f+EUGuESIiIqp71P391qggBABpaWlISEiAn58f7Ozsans4DEJERER1kMYuli6Ps7Oz2meJEREREb0IjVkjRERERFTTGISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1NCoIJSUlwcfHB1ZWVpg8eTIEQVBru8DAQEgkEvHh7+8v1sXGxsLDwwO2traIiIiorqETERFRHaQxQUihUCAwMBDe3t5ISEhAcnIyIiMj1dr27NmzuHjxIjIzM5GZmYmdO3cCADIyMtC7d298+OGHOHXqFDZv3ozo6OhqnAURERHVJRoThPbv3w+ZTIaIiAi4u7sjNDQUa9euLXe727dvQxAEtGrVCpaWlrC0tIRUKgUAbN68GY6OjggJCUGTJk0wY8YMtfokIiIi7aAxQSgxMRG+vr4wMTEBAHh6eiI5Obnc7c6cOYOCggK4uLhAKpUiKCgImZmZYp9dunSBRCIBALRr1w7nzp0rsz+FQgG5XK7yICIiopdTjQehvn37intunn8sXrwYDRs2FNtJJBLo6uqKoaY0KSkp8Pb2xsGDB5GQkIDU1FQEBwcDAORyuUqf5ubmSEtLK7O/sLAwWFhYiA9XV9cXmC0RERFpMomg7orkKpKeno6nT58WK1+0aBEkEonKgmZXV1fExcXB2dlZ7f5jY2PRv39/ZGRk4IMPPsDrr7+OL774AgBQUFAAIyMjKJXKUrdXKBRQKBTic7lcDldXV8hkMpibm6s9DiIiIqo9crkcFhYW5f5+69XgmAAA9erVK7HcwcEBSUlJKmVZWVkwMDCoUP+WlpZ48OABFAoFrK2tkZGRUaH+DA0NYWhoWKHXJCIiorpJY9YI+fj4IC4uTnyempoqhpmy9O/fX2W7+Ph4ODg4wNDQsFif58+fr9DeJSIiInq5aUwQ6tChA2QyGTZs2AAACA8Ph7+/P3R1dQE828VV0iEtT09PTJgwAadPn8aePXsQEhKCMWPGAAB69+6NEydOIDo6Gvn5+Zg3bx4CAgJqblJERESk0Wp8jVBZduzYgQEDBsDMzAwFBQWIjY1Fy5YtAQANGjTAwoUL0bdvX5VtlEolRo0ahW3btsHe3h6DBg1CcHAw9PSeHfVbtmwZxo8fDwsLC0ilUpw+fbrUw3MlUfcYIxEREWkOdX+/NSoIAUBaWhoSEhLg5+cHOzu7Kunz2rVruHTpEjp27FjhMMMgREREVPfU2SCkaRiEiIiI6h51f781Zo0QERERUU1jECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdZiECIiIiKtxSBEREREWotBiIiIiLQWgxARERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIERERkdbSqCCUlJQEHx8fWFlZYfLkyRAEodxtZs2aBYlEUuwRExMDAAgMDFQp9/f3r+ZZEBERUV2hMUFIoVAgMDAQ3t7eSEhIQHJyMiIjI8vdburUqcjMzBQfiYmJsLOzwyuvvAIAOHv2LC5evCjW79y5s5pnQkRERHWFxgSh/fv3QyaTISIiAu7u7ggNDcXatWvL3c7IyAiWlpbi48cff8SECRNgYWGB27dvQxAEtGrVSqyXSqU1MBsiIiKqC/RqewBFEhMT4evrCxMTEwCAp6cnkpOTK9THnTt3sH37dly/fh0AcObMGRQUFMDFxQWZmZkIDAzE8uXLYWVlVWofCoUCCoVCfC6XyysxGyIiIqoLanyPUN++fVX24BQ9Fi9ejIYNG4rtJBIJdHV1kZmZqXbfK1aswIABA2BqagoASElJgbe3Nw4ePIiEhASkpqYiODi4zD7CwsJgYWEhPlxdXSs3USIiItJ4EkGdFclVKD09HU+fPi1WvmjRIkgkEkRERIhlrq6uiIuLg7Ozc7n9Fu35OXbsGDw8PEpsExsbi/79+yMjI6PUfkraI+Tq6gqZTAZzc/Nyx0FERESVN2TIEABQa51wWeRyOSwsLMr9/a7xQ2P16tUrsdzBwQFJSUkqZVlZWTAwMFCr3+joaNja2pYaggDA0tISDx48gEKhgKGhYYltDA0NS60jIiKi6jVr1qwafT2NWSzt4+ODuLg48XlqaioUCgWsra3V2j4qKgr9+vVTKevfv79Kn/Hx8XBwcGDQISIi0lANGjRAgwYNauz1NCYIdejQATKZDBs2bAAAhIeHw9/fH7q6ugCe7eJSKpWlbn/gwAF07txZpczT0xMTJkzA6dOnsWfPHoSEhGDMmDHVNwkiIiKqUzQmCOnp6WHVqlUYNWoU6tWrh19//RXh4eFivaenJ/bu3Vvitv/88w/u3LkDHx8flfJp06ahRYsW6NatG8aPH4/Ro0dj2rRp1ToPIiIiqrwhQ4aI64SKCIKAOXPmwM3NDSYmJmjTpg32799fJa9X44uly5OWloaEhAT4+fnBzs6utoej9mIrIiIienElLZaOjIzE8OHDsWTJErRo0QK//PILfvrpJ9y+fbvUJTQau1i6PM7OzmqdJUZERER1WGEBcOMkkJ0OmNYD3PwAHd0Sm6ampsLMzAzDhw+HoaEhfHx80KtXL3H5zIvQuCBEREREL7nkXcCBrwD5nf8vM3cCenxXYvMPP/wQP/74I1q2bIkuXbrA19cX7777LiwsLF54KBqzRoiIiIi0QPIuIGqQaggCAPndZ+WPbxXbpFmzZrh69Sq++eYbGBkZYebMmWjZsmWZ1wVUF4MQERER1YzCgmd7glDS8uT/laWdBf6zfHnNmjWIjY1FUFAQFi9ejDNnziAtLQ179ux54SHx0BgRERHVjBsni+8JUiEAyqfAk/sqpRkZGZg1axYUCgVcXV2xa9cuAIC7u/sLD4lBiIiIiGpGdrp67ZSqt+KaPHkysrKyMHXqVNy9excuLi748ccf0aFDhxceksadPq9pePo8ERFRFbn+B/DT2+W3G7wHaPjmC72Uur/fXCNERERENcPN79nZYZCU0kACmDs/a1dDGISIiIioZujoPneK/H/D0P+e9wgv9XpC1TKkGnslIiIioha9gfc3AOaOquXmTs/KW/Su0eFwsTQRERHVrBa9gea91L6ydHViECIiIqKap6P7wguiq2QYtT0AIiIiotrCIERERERai0GIiIiItBaDEBEREWktBiEiIiLSWgxCREREpLUYhIiIiEhrMQgRERGR1mIQIiIiIq3FK0uXQxAEAIBcLq/lkRAREZG6in63i37HS8MgVI6srCwAgKuray2PhIiIiCoqKysLFhYWpdZLhPKikpYrLCzEnTt3YGZmBolEUmZbuVwOV1dX3Lp1C+bm5jU0wtqljXMGOG9tmrc2zhngvLVp3i/rnAVBQFZWFpycnKCjU/pKIO4RKoeOjg5cXFwqtI25uflL9R+TOrRxzgDnrU20cc4A561NXsY5l7UnqAgXSxMREZHWYhAiIiIircUgVIUMDQ0xc+ZMGBoa1vZQaow2zhngvLVp3to4Z4Dz1qZ5a+Ocn8fF0kRERKS1uEeIiIiItBaDEBEREWktBiEiIiLSWgxCREREpLUYhNT08OFDNGzYEKmpqWpvs2rVKjg6OkJfXx/du3fH3bt3xbrAwEBIJBLx4e/vXw2jfnGVmXdsbCw8PDxga2uLiIgItes0RVJSEnx8fGBlZYXJkyeXe58aAJg1a5bK51n0iImJAVA3Pu/KzBsoe26a/nlXds519btdmflq4/e5rn6+z6vMvOvyd/mFCFSujIwMwdfXVwAgXL9+Xa1t/vjjD8He3l44fPiwcOvWLeHNN98UBgwYINY7OjoKFy9eFDIzM4XMzEwhOzu7mkZfeZWZ9/379wVzc3Nh9uzZQkpKivDqq68Kx44dK7dOU+Tm5goNGjQQRo4cKVy7dk146623hHXr1pW73dOnT8XPMjMzU0hMTBTs7OyEx48fC4Kg+Z93ZectCKXPTdM/78rOua5+tyszX238PtfVz/d5lf1vu65+l18Ug5AaunbtKixcuLBCgWDNmjXCb7/9Jj5ft26d0LRpU0EQBOHWrVuCg4NDdQy1SlVm3gsWLBCaNWsmFBYWCoIgCDt27BA++uijcus0xfbt2wUrKyvhyZMngiAIwvnz54XXX3+9wv2MGDFCCA0NFQShbnzelZ13WXPT9M+7snOuq9/tysxXG7/PdfXzfV5l5l2Xv8sviofG1LBq1SqMGzeuQtsMHz4c77zzjvj8ypUraNy4MQDgzJkzKCgogIuLC6RSKYKCgpCZmVmlY64KlZl3YmIiunTpIt6gtl27djh37ly5dZoiMTERvr6+MDExAQB4enoiOTm5Qn3cuXMH27dvx+effw6gbnzelZ13WXPT9M+7snOuq9/tysxXG7/PdfXzfV5l5l2Xv8svikHof/r27QtLS8tijx9//BGNGjV6ob4fPnyIlStXYsyYMQCAlJQUeHt74+DBg0hISEBqaiqCg4OrYhoVVtXzlsvlaNiwofjc3NwcaWlp5dbVtNLmvXjxYpUxSiQS6OrqVuiP3YoVKzBgwACYmpoCqBufd2XnXdbcNOXzrs7PWpO/2//1389DnfnWle9zaSoz5+fVpc/3eZWZd134LlcX3n3+f1auXImnT58WK7e2tn7hvseMGQM/Pz/06tULADB16lRMnTpVrP/uu+/Qv39/LF++/IVfq6Kqet56enoql2k3MjJCTk5OuXU1rbR5L1q0SPy/niJF47Sysiq334KCAqxevRrHjh0Ty+rC513ZeZc1N035vKvrswY0+7v9X//9PIDy51tXvs+lqcycn1eXPt/nVWbedeG7XF0YhP6nXr161dLvunXrcPz4cZw/f77UNpaWlnjw4AEUCkWN3+ulqudtbW2NjIwM8XlWVhYMDAzKratppc3bwcEBSUlJKmUVGWd0dDRsbW3h4eFRahtN/LxfdN5Fnp+bpnze1TVnTf9u/5e1tXWF51tXvs+lqcyci9S1z/d5LzLvIpr4Xa4uPDRWjc6cOYPx48dj69atKn+M+/fvj7i4OPF5fHw8HBwcNOqLVFk+Pj4qczt//jycnZ3LrdMU/x1jamqq+IdAHVFRUejXr59KWV34vCs777Lmpumf94t81nXxu12Z+Wrr97kufr7Pq8y86/J3+YXV9mrtugQlnD0lk8mEvLy8Ym3v3bsn2NvbC998842QlZUlPgRBEGbPni34+voKcXFxwu7duwUHBwdhzpw5NTGFSqnIvDMyMgQjIyPh2LFjglKpFHr16iV89tln5dZpCqVSKdjZ2Qk//fSTIAiCMHLkSOHtt98W60ubdxFXV9dip5XWhc+7svMua26a/nlXds519btd1ny18fv8sn2+z6vMvOvyd/lFMQhVQEmBwM3NTdi+fXuxtgsWLBAAFHsIgiDk5eUJw4YNE8zMzAR3d3dh9uzZglKprIEZVE5F5i0IgrB06VJBX19fsLW1Fdzc3IR79+6pVacptm/fLhgbGwv29vaCjY2NkJSUJNaVNe9r164Jurq64h/NInXl867MvMubm6Z/3pWZc13+bpc2X238Pr+Mn+/zKjrvuv5dfhESQVDzUqpEFXDt2jVcunQJHTt2hLm5udp1miItLQ0JCQnw8/ODnZ1dbQ+nxlTHvDX989a2z7oy8+X3uW6q6nnXhc+6MhiEiIiISGtxsTQRERFpLQYhIiIi0loMQkRERKS1GISIiIhIazEIEZFGSk9Pr/bXuHPnjsrzxMRE3Lt3D8Czi9CpKyYmpkLtiUhz8KwxItI4t2/fRv369fHXX3+hTZs25bafNm0atm7dCjc3txLrT506hatXr6J+/fpimVwuh729PQ4dOoQOHToAALp37w5fX18MHjwYvr6+uHbtGiwsLMp9/T59+sDJyUnj7jlFROXjvcaISOMcPHgQbdu2VSsEAYCxsTEKCwuRn59fZpvn7dixA35+fmIIysnJwalTp7Bx40bUq1cP06dPx6NHj2BgYAB9fX3o6T37czl//nzMmzdP5bYKT58+RV5eHvbv3w8AUCqVyM7OxqNHj6Crq6vWHObNm4ekpCRERkaq1Z6IqgaDEBFphMjISAwbNkzlZo5GRkbF2hUUFOCNN95AdHS0SlnPnj0xZMiQEvvu3bt3sZAUFRWF8ePHY/Pmzbh9+zYaNGgApVKJ119/Hfn5+bhz5w6WLFmC3NxcLF26FH379gUA5Ofno1+/fli2bBny8vIQFRWFoKAg6OnpQaFQYPXq1Rg5ciT09fXVnvuGDRswdepUfPzxx2pvQ0RVg0GIiDSCsbExOnTogJiYmDLbRUZG4pdfflEpe/3113H8+HHs2bOnxG0+/fRTlVB15coVXL58GW+//Tb69OmDr776Ct988w28vLwQFxeH1NRU+Pv749q1ayX2J5FI8PTpUxQUFGDgwIEYMGAAgGeB7PPPP8eIESOQm5tbYpD7r5iYGERERGDo0KFQKpXltieiqsUgREQaQd1DSM+3XbduHX744QeYm5vD1NQUEomkxPaFhYXYv38/zMzMEBMTg6lTpwJ4tibI2dkZurq6+PPPP9GyZUuV7QRBQF5ensphMEEQoK+vj27dukEmkwEAXn31VbEOANq1awelUonTp0/DzMyszLk0bdoUcXFxCA8P54JrolrAIEREGmfq1KlYsWIFbG1tAQCPHj1C586d8dtvv6m0GzZsGIYNG4ZDhw4hJSWlzD7fffddODo6Ani2hyg9PR1bt27F3LlzsXDhQowcORJLlixBgwYNkJ+fj/T0dLi5uUFHR0cloOTm5sLQ0BAnTpxATk4OpFIpfv31VwBAXl4eWrZsib/++gs6OuqdlOvk5KTu20JE1YBBiIg0jpGRET7++GP8+OOPAIBZs2aVepgKALZu3QqJRILAwEAAQFhYGHr06IFXXnkFAPDZZ5/htddeE4NQz549ER0djTZt2qB+/fqYP38+zp8/jxMnTpR7aOzJkyewt7cXn48cORLz5s1TeZ6fn6+y1omINBeDEBHVeTo6Ojh27BiuXLkC4Nldsn/77TccPXoUwLM9Ss/vobl8+TLeeecdmJmZYePGjQgJCcFrr72GixcvwsvLC3l5ebh16xZat26NrKws/PPPP+LhuLt378LLywvTp09HVFQUAEAqlYp9P336FCEhIfjuu+9qavpE9AIYhIhI4+Tm5mLDhg3i4ufHjx+jW7dupbZv2rQpdHR0xD01GRkZ8PT0RKNGjQAAdnZ2KguXXVxcsGTJEnTq1AkuLi4AgPPnz6N169Yqe4QuXrxY7LWuXbsGFxcXfPTRR5g9ezZee+01fPPNNwgICMDp06cRFBSEKVOmVNl7QUTVi0GIiDROeHg4wsPD1Wqbl5eHbdu2wcDAAMnJyQCABw8e4MKFC7h58yaAZ6e8R0dHw8PDAwBgamqKjz76CLdu3cLOnTtx+vRp9OzZs9zXksvluHDhAry9vQEAenp62LhxI3r27IkJEyZg0aJFiIqKgo2NTWWmTUS1gEGIiDTC06dPy6zPzs7GtWvXcOXKFZiYmIjl+vr62LFjB+rVqyde9LBv374YNWoUevToUWLfM2bMwA8//AAbGxu0bdsWnp6e0NfXFw+N5efn49GjR/Dy8kJOTg7MzMxw9uxZrFu3Dm+++SZMTU3Ffq9fvw5nZ2dMmDABbdu2Fcfn6OgIKyurUs9kIyLNwFtsEJFG2LRpE7Zu3VrqtYCUSiWaN28OU1NTfP/99wgICEB6ejoCAgJgbm6usgbon3/+gZ2dHczNzcWy3NxceHl5YcWKFbh58yZycnLQvHlzsf7PP//El19+ibi4uFLH+P3336NVq1bIycnBjBkzUFBQAD8/P3zwwQfo0KEDDh06hH379iEuLg6XLl3C6NGjsXjx4ip4d4ioujAIERFVUF5eHrKzs2FtbV1qG6VSiYKCArUuqkhEtYdBiIiIiLSWelf8IiIiInoJMQgRERGR1mIQIiIiIq3FIERERERai0GIiIiItBaDEBEREWktBiEiIiLSWgxCREREpLX+D7eiRm4/Lto9AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots() \n",
    "for word, idx in word_to_idx.items():\n",
    "    # 获取每个单词的嵌入向量\n",
    "    vec = cbow_model.input_to_hidden.weight[:,idx].detach().numpy() \n",
    "    ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点\n",
    "    ax.annotate(word, (vec[0], vec[1]), fontsize=12) # 点旁添加单词标签\n",
    "plt.title(' 二维词嵌入 ') # 图题\n",
    "plt.xlabel(' 向量维度 1') # X 轴 Label\n",
    "plt.ylabel(' 向量维度 2') # Y 轴 Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3520ac90",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
